package com.laxia.model;

import com.github.pagehelper.Page;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author weishuai
 */
@Getter
@Setter
@Accessors(chain = true)
public class PageBean<T> {

    private Integer pageNum;
    private Integer pageSize;
    private Integer total = 0;
    private Boolean lastPage;
    private List<T> result = new ArrayList<>();

    public Boolean getLastPage() {
        return lastPage == null ? total <= (pageNum - 1) * pageSize + result.size() : lastPage;
    }

    public static <T> PageBean<T> emptyPage(PageParam pageParam) {
        PageBean<T> pageBean = new PageBean<>();
        pageBean.setTotal(0).setPageNum(pageParam.getPageNum()).setPageSize(pageParam.getPageSize());
        return pageBean;
    }

    public static <T> PageBean<T> of(List<T> collection, Boolean lastPage) {
        PageBean<T> pageBean = new PageBean<>();
        pageBean.setResult(collection);
        pageBean.setLastPage(lastPage);
        return pageBean;
    }

    public static <T> PageBean<T> of(List<T> collection, Integer pageNum, Integer pageSize, Integer total) {
        PageBean<T> pageBean = new PageBean<>();
        pageBean.setResult(collection);
        pageBean.setPageNum(pageNum);
        pageBean.setPageSize(pageSize);
        pageBean.setTotal(total);
        return pageBean;
    }

    public static <T> PageBean<T> of(List<T> collection, PageBean<?> pageParam) {
        PageBean<T> pageBean = new PageBean<>();
        pageBean.setResult(collection);
        pageBean.setPageNum(pageParam.getPageNum());
        pageBean.setPageSize(pageParam.getPageSize());
        pageBean.setTotal(pageParam.getTotal());
        return pageBean;
    }

    public static <T> PageBean<T> of(List<T> collection, Page<?> page) {
        PageBean<T> pageBean = new PageBean<>();
        pageBean.setResult(collection);
        pageBean.setPageNum(page.getPageNum());
        pageBean.setPageSize(page.getPageSize());
        pageBean.setTotal((int) page.getTotal());
        return pageBean;
    }

    public static <T> PageBean<T> of(Page<T> page) {
        PageBean<T> pageBean = new PageBean<>();
        pageBean.setResult(page.getResult());
        pageBean.setPageNum(page.getPageNum());
        pageBean.setPageSize(page.getPageSize());
        pageBean.setTotal((int) page.getTotal());
        return pageBean;
    }

    /**
     * 对象转换
     *
     * @param page
     * @param <T>
     * @return
     */
    public static <T, R> PageBean<R> of(Page<T> page, Function<? super T, ? extends R> mapper) {
        PageBean<R> pageBean = new PageBean<>();
        pageBean.setPageNum(page.getPageNum());
        pageBean.setPageSize(page.getPageSize());
        pageBean.setTotal((int) page.getTotal());
        if (null != page.getResult()) {
            List<R> rs = page.getResult().stream().map(mapper).filter(Objects::nonNull).collect(Collectors.toList());
            pageBean.result = null != rs ? rs : (Collections.EMPTY_LIST);
        } else {
            pageBean.result = Collections.EMPTY_LIST;
        }
        return pageBean;
    }

}
